// utils/tim.js
import TIM from '@tencentcloud/chat';
// import TIM from 'tim-js-sdk';
import TIMUploadPlugin from 'tim-upload-plugin';

// 初始化SDK实例
export let tim = null;
let isInitialized = false;

// 消息监听器集合
const messageListeners = new Set();

// 初始化腾讯云IM
export function initTIM(options) {
	if (isInitialized) {
		console.warn('TIM has already been initialized');
		return Promise.resolve(tim);
	}

	const {
		SDKAppID,
		userID,
		userSig
	} = options;

	// 创建SDK实例
	tim = TIM.create({
		SDKAppID: SDKAppID
	});

	// 注册文件上传插件
	tim.registerPlugin({
		'tim-upload-plugin': TIMUploadPlugin
	});

	// 设置日志级别
	tim.setLogLevel(1); // 0: 普通级别，日志量较多，接入时建议使用 1: release级别，SDK输出关键信息，生产环境时建议使用


	// 登录
	return tim.login({
		userID: userID,
		userSig: userSig
	}).then(() => {
		isInitialized = true;
		console.log('IM登录成功');
		uni.showToast({
			icon: 'none',
			title: '登录成功'
		})
		// 绑定全局事件监听
		bindTIMEvent();

		return tim;
	}).catch(error => {
		console.error('登录失败:', error);
		uni.showToast({
			icon: 'none',
			title: '登录失败'
		})
		throw error;
	});
}

// 绑定TIM事件监听
function bindTIMEvent() {
	if (!tim) return;

	// 监听收到新消息
	tim.on(TIM.EVENT.MESSAGE_RECEIVED, handleMessageReceived);

	// 监听消息撤回
	tim.on(TIM.EVENT.MESSAGE_REVOKED, handleMessageRevoked);

	// 监听会话列表更新
	tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, handleConversationUpdated);

	// 监听网络状态变化
	tim.on(TIM.EVENT.NET_STATE_CHANGE, handleNetStateChange);

	// 监听SDK ready
	tim.on(TIM.EVENT.SDK_READY, handleSDKReady);

	// 监听SDK not ready
	tim.on(TIM.EVENT.SDK_NOT_READY, handleSDKNotReady);

	// 监听被踢下线
	tim.on(TIM.EVENT.KICKED_OUT, handleKickedOut);
}

function offBindTIMEvent() {
	if (!tim) return;

	// 监听收到新消息
	tim.off(TIM.EVENT.MESSAGE_RECEIVED, handleMessageReceived);

	// 监听消息撤回
	tim.off(TIM.EVENT.MESSAGE_REVOKED, handleMessageRevoked);

	// 监听会话列表更新
	tim.off(TIM.EVENT.CONVERSATION_LIST_UPDATED, handleConversationUpdated);

	// 监听网络状态变化
	tim.off(TIM.EVENT.NET_STATE_CHANGE, handleNetStateChange);

	// 监听SDK ready
	tim.off(TIM.EVENT.SDK_READY, handleSDKReady);

	// 监听SDK not ready
	tim.off(TIM.EVENT.SDK_NOT_READY, handleSDKNotReady);

	// 监听被踢下线
	tim.off(TIM.EVENT.KICKED_OUT, handleKickedOut);
}
// 添加消息监听器
export function addMessageListener(listener) {
	removeMessageListener()
	if (typeof listener === 'function') {
		messageListeners.add(listener);
	}
}

// 移除消息监听器
export function removeMessageListener(listener) {
	messageListeners.delete(listener);
}

// 处理收到新消息
function handleMessageReceived(event) {
	// event.data - 存储 Message 对象的数组 - [Message]
	console.log('收到新消息:', event.data);
	uni.showToast({
		icon: 'none',
		title: '收到新消息'
	})
	// 通知所有监听器
	messageListeners.forEach(listener => {
		try {
			listener('MESSAGE_RECEIVED', event.data);
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 处理消息撤回
function handleMessageRevoked(event) {
	// event.data - 存储 Message 对象的数组 - [Message]
	console.log('消息被撤回:', event.data);

	messageListeners.forEach(listener => {
		try {
			listener('MESSAGE_REVOKED', event.data);
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 处理会话更新
function handleConversationUpdated(event) {
	// event.data - 存储 Conversation 对象的数组 - [Conversation]
	console.log('会话列表更新:', event.data);
	uni.setStorageSync('msgList', event.data)
	messageListeners.forEach(listener => {
		try {
			listener('CONVERSATION_UPDATED', event.data);
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 处理网络状态变化
function handleNetStateChange(event) {
	// event.data.state 当前网络状态
	// event.data.oldState 旧的网络状态
	console.log('网络状态变化:', event.data);

	messageListeners.forEach(listener => {
		try {
			listener('NET_STATE_CHANGE', event.data);
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 处理SDK ready
function handleSDKReady() {
	console.log('SDK ready');

	messageListeners.forEach(listener => {
		try {
			listener('SDK_READY');
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 处理SDK not ready
function handleSDKNotReady() {
	console.log('SDK not ready');

	messageListeners.forEach(listener => {
		try {
			listener('SDK_NOT_READY');
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 处理被踢下线
function handleKickedOut(event) {
	// event.data.type - 被踢下线的原因，例如:
	// TIM.TYPES.KICKED_OUT_MULT_ACCOUNT 多实例登录被踢
	// TIM.TYPES.KICKED_OUT_MULT_DEVICE 多设备登录被踢
	// TIM.TYPES.KICKED_OUT_USERSIG_EXPIRED 用户签名过期
	console.log('被踢下线:', event.data);

	messageListeners.forEach(listener => {
		try {
			listener('KICKED_OUT', event.data);
			removeMessageListener()
		} catch (e) {
			console.error('Message listener error:', e);
		}
	});
}

// 登出
export function logoutTIM() {
	if (!tim) return Promise.resolve();

	return tim.logout().then(() => {
		isInitialized = false;
		console.log('TIM logout success');
		offBindTIMEvent()
		removeMessageListener()
		tim.destroy()
	}).catch(error => {
		console.error('TIM logout error:', error);
		throw error;
	});
}

// 获取当前TIM实例
export function getTIMInstance() {
	return tim;
}